package fwmpc.store;

import fwmpc.exception.WeiXinRuntimeException;
import fwmpc.exception.WeixinStatusCodeEnum;
import fwmpc.resource.IWeiXinAttributeItem;
import fwmpc.resource.IWeiXinCommonAttribute;
import lombok.extern.slf4j.Slf4j;

/**
 * 类描述:  微信单服务配置属性存储处理
 *
 * @author 王雷
 * @version 1.0.0
 * @date : 2022/6/28 0028 下午 4:58
 */
@Slf4j
public abstract class WeiXinInStorageService extends AbstractWeiXinInStorageBasicService {

    /**
     * 功能描述：微信配置属性存储处理
     * @param iWeiXinCommonAttribute 微信配置属性存储处理
     * @date : 2022/6/28 0028 下午 4:58
     */
    protected WeiXinInStorageService(IWeiXinCommonAttribute iWeiXinCommonAttribute) {
        super(iWeiXinCommonAttribute);
    }

    /**
     * 功能描述：获取默认微信处理数据描述对象
     *
     * @return 对应存储的配置信息
     * @throws RuntimeException 运行时异常
     * @author : 王雷
     * @date : 2021/1/18 0018 上午 11:14
     */
    @Override
    public IWeiXinAttributeItem giveWeiXinCommonAttributeDefault() throws WeiXinRuntimeException {
        return iWeiXinCommonAttribute.initAttribute(null);
    }

    /**
     * 功能描述：根据枚举获取对应的存储数据
     *
     * @param appId 配置的识别Key
     * @return 对应存储的配置信息
     * @throws RuntimeException 运行时异常
     * @author : 王雷
     * @date : 2021/1/18 0018 上午 11:14
     */
    @Override
    public IWeiXinAttributeItem giveWeiXinCommonAttribute(String appId) throws WeiXinRuntimeException {
        try {
            return giveRedisSerializableManager().giveValueByKeyToLock(REDIS_WEI_XIN_ATTRIBUTE_CONFIG_CACHE_KEY + appId
                    , () -> initWeiXinAttributeData(appId), iWeiXinCommonAttribute.giveExecutionInterval()
                    , iWeiXinCommonAttribute.giveExecutionIntervalUnit());
        } catch (Exception e) {
            if (e.getClass().equals(WeiXinRuntimeException.class)) {
                throw (WeiXinRuntimeException) e;
            }
            throw new WeiXinRuntimeException(WeixinStatusCodeEnum.Code_500.hashCode(), WeixinStatusCodeEnum.Code_500.getContentName()
                    , "初始化缓存数据异常");
        }
    }
}
